package br.pucrio.inf.aaaong.models.domain.form.converters;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.vraptor.ioc.Component;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.AdolescenteBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.CandidatoBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.CelularBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.EscolaridadeBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.PreInscritoBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.basic.beans.TelefoneFixoBean;
import br.pucrio.inf.aaaong.models.domain.database.dao.beans.PreInscricaoBeans;
import br.pucrio.inf.aaaong.models.domain.form.beans.PreInscricaoFormBean;
import br.pucrio.inf.aaaong.models.domain.form.beans.TelefoneFormBean;
import br.pucrio.inf.aaaong.models.domain.form.fields.PreInscricaoFields;
import br.pucrio.inf.aaaong.models.form.converters.atomic.FormCalendarConverter;
import br.pucrio.inf.aaaong.models.form.converters.atomic.FormFaultTolerantConverter;
import br.pucrio.inf.aaaong.models.form.converters.atomic.FormIntegerConverter;
import br.pucrio.inf.aaaong.models.form.errors.FormError;

@Component
public class PreInscricaoBeansFormConverter {
	private static final String TIPO_ADOLESCENTE = "PreInscrito";
	private List<FormError> errors;
	private FormFaultTolerantConverter<FormCalendarConverter, Calendar> calendarConverter;
	private FormFaultTolerantConverter<FormIntegerConverter, Integer> integerConverter;
	
	public PreInscricaoBeans from(PreInscricaoFormBean form, String cpfAssistentePreInscreveu) {
		this.errors = new ArrayList<FormError>();
		this.calendarConverter = buildCalendarConverter();
		this.integerConverter = buildIntegerConverter();
		AdolescenteBean adolescente = buildAdolescente(form);
		CandidatoBean candidato = buildCandidato(form);
		PreInscritoBean preInscrito = buildPreInscrito(form, cpfAssistentePreInscreveu);
		List<TelefoneFixoBean> telefones = buildTelefones(form);
		List<CelularBean> celulares = buildCelulares(form);
		EscolaridadeBean escolaridade = buildEscolaridade(form);
		return new PreInscricaoBeans(adolescente, candidato, preInscrito, telefones, celulares, escolaridade, this.errors);
	}

	private EscolaridadeBean buildEscolaridade(PreInscricaoFormBean form) {
		EscolaridadeBean escolaridade = new EscolaridadeBean();
		escolaridade.setInstituicaoDeEnsino(form.getInstituicaoDeEnsino());
		escolaridade.setTurno(form.getTurnoEscolar());
		if ("Superior".equals(form.getNivelEscolar())) {
			escolaridade.setPeriodo(integerConverter.convert(
				form.getPeriodo(), PreInscricaoFields.PERIODO.getPrettyName()));
			escolaridade.setCurso(form.getCursoSuperior());
		} else {
			escolaridade.setNivelEnsino(form.getNivelEscolar());
			escolaridade.setSerie(integerConverter.convert(
					form.getSerieBasico(), PreInscricaoFields.SERIE_BASICO.getPrettyName()));
		}
		return escolaridade;
	}

	private List<TelefoneFixoBean> buildTelefones(PreInscricaoFormBean form) {
		List<TelefoneFormBean> formTelefones = form.getTelefones();
		List<TelefoneFixoBean> telefones = new ArrayList<TelefoneFixoBean>();
		for (TelefoneFormBean formTelefone: formTelefones) {
			TelefoneFixoBean telefone = new TelefoneFixoBean();
			telefone.setNumero(formTelefone.getNumero());
			telefone.setResponsavel(formTelefone.getResponsavel());
			if (!telefone.isEmpty()) {
				telefones.add(telefone);
			}
		}
		return telefones;
	}

	private List<CelularBean> buildCelulares(PreInscricaoFormBean form) {
		List<TelefoneFormBean> formCelulares = form.getCelulares();
		List<CelularBean> celulares = new ArrayList<CelularBean>();
		for (TelefoneFormBean formCelular: formCelulares) {
			CelularBean celular = new CelularBean();
			celular.setNumero(formCelular.getNumero());
			celular.setResponsavel(formCelular.getResponsavel());
			if (!celular.isEmpty()) {
				celulares.add(celular);
			}
		}
		return celulares;
	}

	private PreInscritoBean buildPreInscrito(PreInscricaoFormBean form, String cpfAssistente) {
		PreInscritoBean p = new PreInscritoBean();
		p.setIndicacao(form.getIndicacao());
		p.setDataInscricao(calendarConverter.convert(
			form.getDataDaInscricao(), PreInscricaoFields.DATA_DE_INSCRICAO.getPrettyName()));
		p.setCpfAssistentePreInscreveu(cpfAssistente);
		return p;
	}

	private CandidatoBean buildCandidato(PreInscricaoFormBean form) {
		CandidatoBean c = new CandidatoBean();
		c.setNumeroDeInscricao(
			integerConverter.convert(form.getNumeroDeInscricao(),
				PreInscricaoFields.NUMERO_DE_INSCRICAO.getPrettyName()));
		return c;
	}

	private AdolescenteBean buildAdolescente(PreInscricaoFormBean form) {
		AdolescenteBean a = new AdolescenteBean();
		a.setTipo(TIPO_ADOLESCENTE);
		a.setName(form.getName());
		
		Calendar dataNascimento = calendarConverter.convert(form.getDataNascimento(), 
			PreInscricaoFields.DATA_NASCIMENTO.getPrettyName());
		a.setDataNascimento(dataNascimento);
		
		a.setLogradouro(form.getLogradouro());
		
		Integer numeroEndereco = integerConverter.convert(form.getNumeroEndereco(), 
			PreInscricaoFields.NUMERO_ENDERECO.getPrettyName());
		a.setNumeroEndereco(numeroEndereco);
		
		a.setBairro(form.getBairro());
		a.setCidade(form.getCidade());
		a.setEstado(form.getEstado());
		a.setPais(form.getPais());
		a.setPontoReferenciaEndereco(form.getPontoReferenciaEndereco());
		a.setCep(form.getCep());
		
		Integer serieTecnico = integerConverter.convert(form.getSerieTecnico(), 
			PreInscricaoFields.SERIE_TECNICO.getPrettyName());
		a.setSerieTecnico(serieTecnico);
		
		a.setCursoTecnico(form.getCursoTecnico());
		return a;
	}

	private FormFaultTolerantConverter<FormIntegerConverter, Integer> buildIntegerConverter() {
		return new FormFaultTolerantConverter
			<FormIntegerConverter, Integer>(new FormIntegerConverter(), errors);
	}

	private FormFaultTolerantConverter<FormCalendarConverter, Calendar> buildCalendarConverter() {
		return new FormFaultTolerantConverter
			<FormCalendarConverter, Calendar>(new FormCalendarConverter(), errors);
	}
}
